package com.bana.sys.service;

import com.bana.sys.code.SystemLogType;
import com.bana.sys.dao.ParameterDAO;
import com.bana.sys.model.Parameter;
import com.bana.sys.utils.PageParameter;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class ParameterService {

    @Resource
    private ParameterDAO parameterDAO;

    @Resource
    private LogService logService;

    /**
     * 参数缓存
     */
    private static Map<String,String> ParameterMap =new ConcurrentHashMap<>();

    /**
     * 更新系统参数，并刷新缓存
     * @param parameter 新的参数
     * @return 旧的参数值
     */
    public void updateParameter(String token,Parameter parameter)
    {
        String oldValue=getString(parameter.getCsbm());
        parameterDAO.updateParameter(parameter);
        logService.insertSystemLog(token, SystemLogType.UpdateParameter,String.format("更新参数 %s->%s",oldValue,parameter.getCsz()),null);
        refresh();
    }

    /**
     * 获取字符串参数值
     * @param key 参数键
     * @return 参数值
     */
    public String getString(String key)
    {
        if(ParameterMap.isEmpty())
        {
            refresh();
        }
        return ParameterMap.get(key);
    }

    /**
     * 获取数字参数值
     * @param key 参数键
     * @return 转换失败返回0，否则返回数字参数值
     */
    public int getInteger(String key)
    {
        if(ParameterMap.isEmpty())
        {
            refresh();
        }
        String value= ParameterMap.get(key);
        try
        {
            return Integer.parseInt(value);
        }
        catch (Exception ex)
        {
            return 0;
        }
    }

    /**
     * 获取布尔类参数值
     * @param key 参数键
     * @return 转换失败返回0，否则返回数字参数值
     */
    public boolean getBoolean(String key)
    {
        if(ParameterMap.isEmpty())
        {
            refresh();
        }
        String value= ParameterMap.get(key);
        try
        {
            return Boolean.parseBoolean(value);
        }
        catch (Exception ex)
        {
            return false;
        }
    }

    /**
     * 刷新参数缓存
     */
    private void refresh()
    {
        for(Parameter parameter:parameterDAO.getParameters(new PageParameter()))
        {
            ParameterMap.put(parameter.getCsbm(),parameter.getCsz());
        }
    }
}
